package com.template.common.util;

import cn.hutool.core.util.StrUtil;
import com.template.common.constant.CommonConstant;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;

/**
 * 日期工具类
 * 
 * @author template
 * @since 2024-01-01
 */
public class DateUtil {

    /**
     * 获取当前时间
     * 
     * @return 当前时间
     */
    public static Date now() {
        return new Date();
    }

    /**
     * 获取当前日期时间
     * 
     * @return 当前日期时间
     */
    public static LocalDateTime nowDateTime() {
        return LocalDateTime.now();
    }

    /**
     * 获取当前日期
     * 
     * @return 当前日期
     */
    public static LocalDate nowDate() {
        return LocalDate.now();
    }

    /**
     * 格式化日期
     * 
     * @param date 日期
     * @param pattern 格式
     * @return 格式化后的字符串
     */
    public static String format(Date date, String pattern) {
        if (date == null) {
            return null;
        }
        if (StrUtil.isEmpty(pattern)) {
            pattern = CommonConstant.DATETIME_FORMAT;
        }
        return cn.hutool.core.date.DateUtil.format(date, pattern);
    }

    /**
     * 格式化日期时间
     * 
     * @param dateTime 日期时间
     * @param pattern 格式
     * @return 格式化后的字符串
     */
    public static String format(LocalDateTime dateTime, String pattern) {
        if (dateTime == null) {
            return null;
        }
        if (StrUtil.isEmpty(pattern)) {
            pattern = CommonConstant.DATETIME_FORMAT;
        }
        return dateTime.format(DateTimeFormatter.ofPattern(pattern));
    }

    /**
     * 格式化日期
     * 
     * @param date 日期
     * @param pattern 格式
     * @return 格式化后的字符串
     */
    public static String format(LocalDate date, String pattern) {
        if (date == null) {
            return null;
        }
        if (StrUtil.isEmpty(pattern)) {
            pattern = CommonConstant.DATE_FORMAT;
        }
        return date.format(DateTimeFormatter.ofPattern(pattern));
    }

    /**
     * 解析日期字符串
     * 
     * @param dateStr 日期字符串
     * @param pattern 格式
     * @return 日期
     */
    public static Date parse(String dateStr, String pattern) {
        if (StrUtil.isEmpty(dateStr)) {
            return null;
        }
        if (StrUtil.isEmpty(pattern)) {
            pattern = CommonConstant.DATETIME_FORMAT;
        }
        return cn.hutool.core.date.DateUtil.parse(dateStr, pattern);
    }

    /**
     * 解析日期时间字符串
     * 
     * @param dateTimeStr 日期时间字符串
     * @param pattern 格式
     * @return 日期时间
     */
    public static LocalDateTime parseDateTime(String dateTimeStr, String pattern) {
        if (StrUtil.isEmpty(dateTimeStr)) {
            return null;
        }
        if (StrUtil.isEmpty(pattern)) {
            pattern = CommonConstant.DATETIME_FORMAT;
        }
        return LocalDateTime.parse(dateTimeStr, DateTimeFormatter.ofPattern(pattern));
    }

    /**
     * 解析日期字符串
     * 
     * @param dateStr 日期字符串
     * @param pattern 格式
     * @return 日期
     */
    public static LocalDate parseDate(String dateStr, String pattern) {
        if (StrUtil.isEmpty(dateStr)) {
            return null;
        }
        if (StrUtil.isEmpty(pattern)) {
            pattern = CommonConstant.DATE_FORMAT;
        }
        return LocalDate.parse(dateStr, DateTimeFormatter.ofPattern(pattern));
    }

    /**
     * 获取时间戳
     * 
     * @return 时间戳
     */
    public static long getTimestamp() {
        return System.currentTimeMillis();
    }

    /**
     * 时间戳转日期
     * 
     * @param timestamp 时间戳
     * @return 日期
     */
    public static Date timestampToDate(long timestamp) {
        return new Date(timestamp);
    }

    /**
     * 日期转时间戳
     * 
     * @param date 日期
     * @return 时间戳
     */
    public static long dateToTimestamp(Date date) {
        if (date == null) {
            return 0;
        }
        return date.getTime();
    }

    /**
     * 获取两个日期之间的天数
     * 
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 天数
     */
    public static long betweenDays(Date startDate, Date endDate) {
        if (startDate == null || endDate == null) {
            return 0;
        }
        return cn.hutool.core.date.DateUtil.betweenDay(startDate, endDate, false);
    }

    /**
     * 获取两个日期之间的天数
     * 
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 天数
     */
    public static long betweenDays(LocalDate startDate, LocalDate endDate) {
        if (startDate == null || endDate == null) {
            return 0;
        }
        return java.time.temporal.ChronoUnit.DAYS.between(startDate, endDate);
    }
}
